Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / frontend / js / WebSocketConnection.js

Displaying Raw • Download


meshchatx/src/frontend/js/WebSocketConnection.js c0b0ddffd735a0d007c1be9a5e8563ec42fdafc0 (c0b0ddff) Text, 8.97 KB

Tff7b72import Tb4b4b4{ Te6edf3createEmitter Tb4b4b4} Tff7b72from Ta5d6ff"../libs/emitter.js"Tb4b4b4;
Tff7b72import Tb4b4b4{ Te6edf3reconnectDelayWithJitterMs Tb4b4b4} Tff7b72from Ta5d6ff"./wsConnectionSupport"Tb4b4b4;

Tff7b72const Te6edf3PING_INTERVAL_MS Tff7b72= T79c0ff25000Tb4b4b4;
Tff7b72const Te6edf3PONG_TIMEOUT_MS Tff7b72= T79c0ff12000Tb4b4b4;
Tff7b72const Te6edf3BASE_RECONNECT_MS Tff7b72= T79c0ff1000Tb4b4b4;
Tff7b72const Te6edf3MAX_RECONNECT_MS Tff7b72= T79c0ff60000Tb4b4b4;
Tff7b72const Te6edf3JITTER_MAX_MS Tff7b72= T79c0ff400Tb4b4b4;

Tff7b72class Te6edf3WebSocketConnection Tb4b4b4{
Tff7b72constructorTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3emitter Tff7b72= Te6edf3createEmitterTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3ws Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_heartbeatInterval Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_pongTimeout Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_reconnectTimeout Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_reconnectAttempt Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3initialized Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3destroyed Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_hadSuccessfulOpen Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_pendingReconnectUi Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_lastReceivedTime Tff7b72= Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_hasEventListeners Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_isForcedReconnect Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}

Tff7b72async Te6edf3connectTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3destroyed Tff7b72= Tff7b72falseTb4b4b4;

Tff7b72if Tb4b4b4(Tff7b72typeof Tffa657window Tff7b72=== Ta5d6ff"undefined" Tff7b72|| Tff7b72!Tffa657windowTb4b4b4.Te6edf3apiTb4b4b4) Tb4b4b4{
Te6edf3setTimeoutTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tff7b72thisTb4b4b4.Te6edf3connectTb4b4b4(Tb4b4b4)Tb4b4b4, T79c0ff100Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}

Tff7b72thisTb4b4b4.Te6edf3initialized Tff7b72= Tff7b72trueTb4b4b4;

Tff7b72if Tb4b4b4(Tff7b72typeof Tffa657window Tff7b72!== Ta5d6ff"undefined" Tff7b72&& Tffa657windowTb4b4b4.Te6edf3addEventListenerTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3_hasEventListenersTb4b4b4) Tb4b4b4{
Tffa657windowTb4b4b4.Te6edf3addEventListenerTb4b4b4(Ta5d6ff"visibilitychange"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72typeof Tffa657document Tff7b72!== Ta5d6ff"undefined" Tff7b72&& Tffa657documentTb4b4b4.Te6edf3visibilityState Tff7b72=== Ta5d6ff"visible"Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3handleForegroundOrNetworkChangeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tffa657windowTb4b4b4.Te6edf3addEventListenerTb4b4b4(Ta5d6ff"focus"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3handleForegroundOrNetworkChangeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tffa657windowTb4b4b4.Te6edf3addEventListenerTb4b4b4(Ta5d6ff"online"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3handleForegroundOrNetworkChangeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_hasEventListeners Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72thisTb4b4b4.Te6edf3reconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3onTb4b4b4(Te6edf3eventTb4b4b4, Te6edf3handlerTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3emitterTb4b4b4.Te6edf3onTb4b4b4(Te6edf3eventTb4b4b4, Te6edf3handlerTb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3offTb4b4b4(Te6edf3eventTb4b4b4, Te6edf3handlerTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3emitterTb4b4b4.Te6edf3offTb4b4b4(Te6edf3eventTb4b4b4, Te6edf3handlerTb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3emitTb4b4b4(Te6edf3typeTb4b4b4, Te6edf3eventTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3emitterTb4b4b4.Te6edf3emitTb4b4b4(Te6edf3typeTb4b4b4, Te6edf3eventTb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3_clearHeartbeatTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3_heartbeatInterval Tff7b72!= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3clearIntervalTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3_heartbeatIntervalTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_heartbeatInterval Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}

Te6edf3_clearPongTimeoutTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3_pongTimeout Tff7b72!= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3clearTimeoutTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3_pongTimeoutTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_pongTimeout Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}

Te6edf3_stopHeartbeatTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3_clearHeartbeatTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_clearPongTimeoutTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3_sendAppPingTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3destroyed Tff7b72|| Tff7b72!Tff7b72thisTb4b4b4.Te6edf3ws Tff7b72|| Tff7b72thisTb4b4b4.Te6edf3wsTb4b4b4.Te6edf3readyState Tff7b72!== Te6edf3WebSocketTb4b4b4.Te6edf3OPENTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72try Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3wsTb4b4b4.Te6edf3sendTb4b4b4(Tffa657JSONTb4b4b4.Te6edf3stringifyTb4b4b4(Tb4b4b4{ Te6edf3typeTff7b72: Ta5d6ff"ping" Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3_clearPongTimeoutTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_pongTimeout Tff7b72= Te6edf3setTimeoutTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3_pongTimeout Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3destroyed Tff7b72|| Tff7b72!Tff7b72thisTb4b4b4.Te6edf3wsTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72try Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3wsTb4b4b4.Te6edf3closeTb4b4b4(T79c0ff4000Tb4b4b4, Ta5d6ff"heartbeat timeout"Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// ignore
Tb4b4b4}
Tb4b4b4}Tb4b4b4, Te6edf3PONG_TIMEOUT_MSTb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3_startHeartbeatTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3_stopHeartbeatTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_heartbeatInterval Tff7b72= Te6edf3setIntervalTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3_sendAppPingTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4, Te6edf3PING_INTERVAL_MSTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_sendAppPingTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3reconnectTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3initialized Tff7b72|| Tff7b72thisTb4b4b4.Te6edf3destroyed Tff7b72|| Tff7b72typeof Tffa657window Tff7b72=== Ta5d6ff"undefined" Tff7b72|| Tff7b72!Tffa657windowTb4b4b4.Te6edf3locationTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}

T8b949e// Don't tear down a connection that is already open, and don't
T8b949e// abandon one that is already in flight (e.g. triggered again by a
T8b949e// near-simultaneous focus/visibilitychange/online event) - doing so
T8b949e// would thrash the socket and could delay recovery indefinitely.
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3ws Tff7b72&& Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3wsTb4b4b4.Te6edf3readyState Tff7b72=== Te6edf3WebSocketTb4b4b4.Te6edf3OPEN Tff7b72|| Tff7b72thisTb4b4b4.Te6edf3wsTb4b4b4.Te6edf3readyState Tff7b72=== Te6edf3WebSocketTb4b4b4.Te6edf3CONNECTINGTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}

T8b949e// A new attempt is starting now, so any previously scheduled
T8b949e// backoff retry (from an earlier close) is redundant - drop it so
T8b949e// it can't later fire and interfere with this attempt.
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3_reconnectTimeout Tff7b72!= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3clearTimeoutTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3_reconnectTimeoutTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_reconnectTimeout Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3wsTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3wsTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// ignore
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3ws Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}

Tff7b72const Te6edf3wsUrl Tff7b72= Tffa657windowTb4b4b4.Te6edf3locationTb4b4b4.Te6edf3originTb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff/^https/Tb4b4b4, Ta5d6ff"wss"Tb4b4b4)Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff/^http/Tb4b4b4, Ta5d6ff"ws"Tb4b4b4) Tff7b72+ Ta5d6ff"/ws"Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3ws Tff7b72= Tff7b72new Te6edf3WebSocketTb4b4b4(Te6edf3wsUrlTb4b4b4)Tb4b4b4;

Tff7b72thisTb4b4b4.Te6edf3wsTb4b4b4.Te6edf3addEventListenerTb4b4b4(Ta5d6ff"open"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3destroyedTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3_reconnectTimeout Tff7b72!= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3clearTimeoutTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3_reconnectTimeoutTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_reconnectTimeout Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3_reconnectAttempt Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_stopHeartbeatTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_startHeartbeatTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3isReconnect Tff7b72= Tff7b72thisTb4b4b4.Te6edf3_pendingReconnectUiTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_pendingReconnectUi Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_hadSuccessfulOpen Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_lastReceivedTime Tff7b72= Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"connected"Tb4b4b4, Tb4b4b4{ Te6edf3isReconnect Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Tff7b72thisTb4b4b4.Te6edf3wsTb4b4b4.Te6edf3addEventListenerTb4b4b4(Ta5d6ff"close"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3_stopHeartbeatTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3destroyedTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3_isForcedReconnectTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3_isForcedReconnect Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3_hadSuccessfulOpenTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3_pendingReconnectUi Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"disconnected"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3delay Tff7b72= Te6edf3reconnectDelayWithJitterMsTb4b4b4(
Tff7b72thisTb4b4b4.Te6edf3_reconnectAttemptTb4b4b4,
Te6edf3BASE_RECONNECT_MSTb4b4b4,
Te6edf3MAX_RECONNECT_MSTb4b4b4,
Te6edf3JITTER_MAX_MS
Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_reconnectAttempt Tff7b72+= T79c0ff1Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3_reconnectTimeout Tff7b72!= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3clearTimeoutTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3_reconnectTimeoutTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3_reconnectTimeout Tff7b72= Te6edf3setTimeoutTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3_reconnectTimeout Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3destroyedTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3reconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4, Te6edf3delayTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Tff7b72thisTb4b4b4.Te6edf3wsTb4b4b4.Te6edf3addEventListenerTb4b4b4(Ta5d6ff"error"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
T8b949e// close event will follow, and reconnect is scheduled there
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Tff7b72thisTb4b4b4.Te6edf3wsTb4b4b4.Te6edf3onmessage Tff7b72= Tb4b4b4(Te6edf3messageTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3_lastReceivedTime Tff7b72= Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3data Tff7b72= Tffa657JSONTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3messageTb4b4b4.Te6edf3dataTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3data Tff7b72&& Te6edf3dataTb4b4b4.Te6edf3type Tff7b72=== Ta5d6ff"pong"Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3_clearPongTimeoutTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// non-json: forward
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"message"Tb4b4b4, Te6edf3messageTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4;
Tb4b4b4}

Te6edf3handleForegroundOrNetworkChangeTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3initialized Tff7b72|| Tff7b72thisTb4b4b4.Te6edf3destroyedTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}

T8b949e// A connection attempt is already in flight (e.g. a previous
T8b949e// foreground/network event just started one) - let it resolve on
T8b949e// its own rather than tearing it down and starting another.
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3ws Tff7b72&& Tff7b72thisTb4b4b4.Te6edf3wsTb4b4b4.Te6edf3readyState Tff7b72=== Te6edf3WebSocketTb4b4b4.Te6edf3CONNECTINGTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3ws Tff7b72|| Tff7b72thisTb4b4b4.Te6edf3wsTb4b4b4.Te6edf3readyState Tff7b72!== Te6edf3WebSocketTb4b4b4.Te6edf3OPENTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3reconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}

Tff7b72const Te6edf3idleTime Tff7b72= Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4) Tff7b72- Tff7b72thisTb4b4b4.Te6edf3_lastReceivedTimeTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3idleTime Tff7b72> Te6edf3PING_INTERVAL_MSTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3forceReconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3_sendAppPingTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Te6edf3forceReconnectTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3initialized Tff7b72|| Tff7b72thisTb4b4b4.Te6edf3destroyedTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3wsTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3_isForcedReconnect Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72try Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3wsTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// ignore
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3ws Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3reconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3destroyTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3destroyed Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3initialized Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_hadSuccessfulOpen Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_pendingReconnectUi Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_stopHeartbeatTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3_reconnectTimeout Tff7b72!= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3clearTimeoutTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3_reconnectTimeoutTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_reconnectTimeout Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3wsTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3wsTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// ignore
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3ws Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}

Te6edf3sendTb4b4b4(Te6edf3messageTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3ws Tff7b72!= Tff7b72null Tff7b72&& Tff7b72thisTb4b4b4.Te6edf3wsTb4b4b4.Te6edf3readyState Tff7b72=== Te6edf3WebSocketTb4b4b4.Te6edf3OPENTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3wsTb4b4b4.Te6edf3sendTb4b4b4(Te6edf3messageTb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}

Te6edf3pingTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3sendTb4b4b4(
Tffa657JSONTb4b4b4.Te6edf3stringifyTb4b4b4(Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"ping"Tb4b4b4,
Tb4b4b4}Tb4b4b4)
Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// ignore
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72export Tff7b72default Tff7b72new Te6edf3WebSocketConnectionTb4b4b4(Tb4b4b4)Tb4b4b4;


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────